Android অ্যাপে Activity এবং Fragment এর মধ্যে ডেটা যোগাযোগ করা একটি সাধারণ কাজ, যা অ্যাপের ভেতরে বিভিন্ন কম্পোনেন্টের ইন্টারঅ্যাকশনের জন্য অত্যন্ত গুরুত্বপূর্ণ। Activity এবং Fragment এর মধ্যে ডেটা আদান-প্রদানের বেশ কয়েকটি পদ্ধতি রয়েছে। নিচে এই পদ্ধতিগুলো এবং তাদের উদাহরণ আলোচনা করা হলো:
১. Fragment থেকে Activity এর কাছে Data Communication
Fragment থেকে Activity-তে ডেটা পাঠানোর জন্য Interface ব্যবহার করা সবচেয়ে সাধারণ এবং কার্যকরী পদ্ধতি। এটি একটি callback pattern ব্যবহার করে Fragment থেকে Activity-তে ডেটা পাঠায়।
ধাপ ১: Fragment এ Interface তৈরি করুন
public class MyFragment extends Fragment {
// Interface for communication
public interface OnDataPassListener {
void onDataPass(String data);
}
private OnDataPassListener dataPassListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
dataPassListener = (OnDataPassListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement OnDataPassListener");
}
}
// Call this method to pass data to Activity
public void sendDataToActivity(String data) {
if (dataPassListener != null) {
dataPassListener.onDataPass(data);
}
}
}
ধাপ ২: Activity তে Interface ইমপ্লিমেন্ট করুন
public class MainActivity extends AppCompatActivity implements MyFragment.OnDataPassListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Fragment যোগ করুন
MyFragment fragment = new MyFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, fragment)
.commit();
}
// Implement the method from the interface
@Override
public void onDataPass(String data) {
// Fragment থেকে প্রাপ্ত ডেটা হ্যান্ডেল করুন
Toast.makeText(this, "Data received: " + data, Toast.LENGTH_SHORT).show();
}
}
এখানে MyFragment থেকে MainActivity তে Interface ব্যবহার করে ডেটা পাঠানো হয়েছে। sendDataToActivity() মেথড কল করার মাধ্যমে Fragment থেকে Activity তে ডেটা পাঠানো হয়।
২. Activity থেকে Fragment এ Data Communication
Activity থেকে Fragment এ ডেটা পাঠানো সাধারণত Bundle ব্যবহার করে করা হয়। আপনি Fragment তৈরি করার সময় ডেটা Bundle এ রেখে সেটি Fragment এ পাঠাতে পারেন।
ধাপ ১: Fragment ক্লাস তৈরি করুন
public class MyFragment extends Fragment {
private String data;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_my, container, false);
// Get data from Bundle
if (getArguments() != null) {
data = getArguments().getString("key");
Toast.makeText(getContext(), "Data received: " + data, Toast.LENGTH_SHORT).show();
}
return view;
}
// Static method for creating a new instance with data
public static MyFragment newInstance(String data) {
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
args.putString("key", data);
fragment.setArguments(args);
return fragment;
}
}
ধাপ ২: Activity থেকে Fragment এ ডেটা পাঠান
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Fragment তৈরি করুন এবং ডেটা পাঠান
MyFragment fragment = MyFragment.newInstance("Hello Fragment");
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
}
এখানে newInstance() মেথডের মাধ্যমে Fragment তৈরি করার সময় Bundle ব্যবহার করে ডেটা পাঠানো হয়েছে। Fragment এ ডেটা onCreateView() মেথডে getArguments() এর মাধ্যমে রিসিভ করা হয়েছে।
৩. Fragment থেকে Fragment এ Data Communication (Through Activity)
Fragment থেকে অন্য Fragment এ ডেটা পাঠানোর জন্য, সাধারণত Activity একটি Mediator হিসেবে কাজ করে। প্রথম Fragment থেকে ডেটা Activity-তে পাঠানো হয় এবং তারপর Activity সেই ডেটা অন্য Fragment-এ পাঠায়।
ধাপ ১: প্রথম Fragment থেকে Activity তে ডেটা পাঠান (আগের উদাহরণে যেমন দেখানো হয়েছে)।
ধাপ ২: Activity তে ডেটা গ্রহণ করে দ্বিতীয় Fragment এ পাঠান
public class MainActivity extends AppCompatActivity implements FirstFragment.OnDataPassListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// প্রথম Fragment যোগ করুন
FirstFragment firstFragment = new FirstFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment)
.commit();
}
// Fragment থেকে ডেটা গ্রহণ করার পরে এটি অন্য Fragment এ পাঠান
@Override
public void onDataPass(String data) {
SecondFragment secondFragment = SecondFragment.newInstance(data);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, secondFragment)
.commit();
}
}
ধাপ ৩: দ্বিতীয় Fragment এ ডেটা গ্রহণ করুন
public class SecondFragment extends Fragment {
private String data;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_second, container, false);
// Get data from Bundle
if (getArguments() != null) {
data = getArguments().getString("key");
Toast.makeText(getContext(), "Data received: " + data, Toast.LENGTH_SHORT).show();
}
return view;
}
public static SecondFragment newInstance(String data) {
SecondFragment fragment = new SecondFragment();
Bundle args = new Bundle();
args.putString("key", data);
fragment.setArguments(args);
return fragment;
}
}
এখানে FirstFragment থেকে ডেটা MainActivity তে পাঠানো হয়েছে এবং তারপর সেই ডেটা SecondFragment এ পাঠানো হয়েছে।
৪. ViewModel ব্যবহার করে Fragment এবং Activity এর মধ্যে Data Communication
ViewModel হল একটি Lifecycle-aware কম্পোনেন্ট, যা Activity এবং Fragment এর মধ্যে ডেটা শেয়ার করতে ব্যবহৃত হয়। এটি ডেটা সংরক্ষণ করে রাখে এবং লাইফসাইকেল পরিবর্তনের সময় ডেটা হারানো থেকে রক্ষা করে।
উদাহরণ: ViewModel ব্যবহার করে Data Communication
ধাপ ১: ViewModel তৈরি করুন
public class SharedViewModel extends ViewModel {
private MutableLiveData<String> sharedData = new MutableLiveData<>();
public void setData(String data) {
sharedData.setValue(data);
}
public LiveData<String> getData() {
return sharedData;
}
}
ধাপ ২: প্রথম Fragment এ ViewModel ব্যবহার করুন
public class FirstFragment extends Fragment {
private SharedViewModel sharedViewModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, container, false);
sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
Button button = view.findViewById(R.id.button);
button.setOnClickListener(v -> {
sharedViewModel.setData("Data from First Fragment");
});
return view;
}
}
ধাপ ৩: দ্বিতীয় Fragment এ ViewModel ব্যবহার করুন
public class SecondFragment extends Fragment {
private SharedViewModel sharedViewModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_second, container, false);
sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
sharedViewModel.getData().observe(getViewLifecycleOwner(), data -> {
Toast.makeText(getContext(), "Data received: " + data, Toast.LENGTH_SHORT).show();
});
return view;
}
}
এখানে ViewModel ব্যবহার করে দুটি Fragment এর মধ্যে ডেটা শেয়ার করা হয়েছে। প্রথম Fragment থেকে ডেটা সেট করলে দ্বিতীয় Fragment এ সেই ডেটা দেখা যাবে।
উপসংহার
Activity এবং Fragment এর মধ্যে ডেটা আদান-প্রদানের জন্য বিভিন্ন পদ্ধতি রয়েছে। Interface, Bundle, এবং ViewModel ব্যবহার করে আপনি সহজেই ডেটা শেয়ার করতে পারেন। আপনার অ্যাপ্লিকেশনের চাহিদা অনুযায়ী উপযুক্ত পদ্ধতি বেছে নেওয়া উচিত। ViewModel সবচেয়ে আধুনিক এবং কার্যকরী পদ্ধতি,